/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.reportes;

import com.camachosanchez.bean.ControlCambioNeumatico;
import com.camachosanchez.bean.DetalleControlCambioNeumatico;
import com.camachosanchez.bean.Flotillas;
import com.camachosanchez.bean.MarcasVehiculo;
import com.camachosanchez.bean.TiposVehiculo;
import com.camachosanchez.gui.Principal;
import com.camachosanchez.process.VehiculoOrdenadoPorCodigo;
import com.camachosanchez.util.JPAUtil;
import com.camachosanchez.util.ReportUtil;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.swing.JOptionPane;

/**
 *
 * @author ZULLY
 */
public class ReporteNeumaticosXUnidad {
    
    private EntityManagerFactory emf;
    private EntityManager em;
    private SimpleDateFormat formatoFechaEnNombre;
    
    public ReporteNeumaticosXUnidad(){
        emf = JPAUtil.getEntityManagerFactory();
        em = emf.createEntityManager();
        formatoFechaEnNombre = new SimpleDateFormat("dd-MM-yyyy");
    }
    
    public void generarReporte(Flotillas flotilla, TiposVehiculo tipoVehiculo, MarcasVehiculo marcaVehiculo, Date fechaDesde, Date fechaHasta){
        Document document = new Document(PageSize.A4.rotate(), 30, 30, 20, 20);
        try {
            String nombrePdf = "reportes/neumaticosXVehiculo" + formatoFechaEnNombre.format(new Date()) + ".pdf";
            PdfWriter.getInstance(document, new FileOutputStream(nombrePdf));
            document.open();
            PdfPTable tablaC = new PdfPTable(1);
            tablaC.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaC.setWidthPercentage(90);
            PdfPCell celda = new PdfPCell(new Phrase("NEUMÁTICOS POR UNIDAD", FontFactory.getFont(BaseFont.HELVETICA, 12, Font.NORMAL, BaseColor.BLACK)));
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
            celda.setBorder(Rectangle.NO_BORDER);
            tablaC.addCell(celda);
            document.add(tablaC);
            
            float[] anchoColsInf = {1f, 2.5f, 3f, 3f, 1f, 2f, 2f, 1f};
            PdfPTable tablaInf = new PdfPTable(anchoColsInf);
            tablaInf.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaInf.setSpacingBefore(10f);
            tablaInf.setWidthPercentage(90);
            
            List<ControlCambioNeumatico> cambios = this.getListaNeumaticos(flotilla, tipoVehiculo, marcaVehiculo, fechaDesde, fechaHasta);
            
            //ordenación especial por código de vehículo
            List<VehiculoOrdenadoPorCodigo> lstVehiculosOrdenados = new ArrayList<VehiculoOrdenadoPorCodigo>();
            for(ControlCambioNeumatico cambio : cambios) {
                lstVehiculosOrdenados.add(new VehiculoOrdenadoPorCodigo(cambio.getIdVehiculo().getCodBarras(), cambio));
            }
            lstVehiculosOrdenados = VehiculoOrdenadoPorCodigo.ordenar(lstVehiculosOrdenados);
            
            for(VehiculoOrdenadoPorCodigo vehiculo : lstVehiculosOrdenados){
                ControlCambioNeumatico cambio = vehiculo.getControlCambio();
                String codigoUnidad = (cambio.getIdVehiculo().getCodBarras() != null) ? cambio.getIdVehiculo().getCodBarras() : "";
                tablaInf.addCell(ReportUtil.getCeldaBorde("UNIDAD: " + codigoUnidad + " :: " + cambio.getIdVehiculo().getPlaca(), 8, 1, BaseColor.WHITE, 0, 0, 9, 1));
                tablaInf.addCell(ReportUtil.getCelda("Pos", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
                tablaInf.addCell(ReportUtil.getCelda("Código", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
                tablaInf.addCell(ReportUtil.getCelda("Marca", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
                tablaInf.addCell(ReportUtil.getCelda("Medida", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
                tablaInf.addCell(ReportUtil.getCelda("R", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
                tablaInf.addCell(ReportUtil.getCelda("Altura", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
                tablaInf.addCell(ReportUtil.getCelda("Estado", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
                tablaInf.addCell(ReportUtil.getCelda("Km Total", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
                
                List<DetalleControlCambioNeumatico> detalle = cambio.getDetalleControlCambioNeumaticoList();
                Collections.sort(detalle);
                for(DetalleControlCambioNeumatico item : detalle){
                    if(item.getTipo() >= 0){//Solo montajes yneutros
                        String posicion = (item.getPosicion() <= 0) ? "R" : item.getPosicion() + "";
                        String codigo = item.getIdNeumatico().getCodigo();
                        String marca = (item.getIdNeumatico().getIdMarca() == null) ? "" : item.getIdNeumatico().getIdMarca().getNombre();
                        String medida= (item.getIdNeumatico().getIdModelo() == null) ? "" : item.getIdNeumatico().getIdModelo().getMedida();
                        String reenc = item.getIdNeumatico().getNumRenovaciones() + "";
                        Double alturaMinima = item.getIdNeumatico().getLabradoCentral();
                        if(alturaMinima != null && alturaMinima < item.getIdNeumatico().getLabradoExterior()){
                            alturaMinima = item.getIdNeumatico().getLabradoExterior();
                        }
                        if(alturaMinima != null && alturaMinima < item.getIdNeumatico().getLabradoInterno()){
                            alturaMinima = item.getIdNeumatico().getLabradoInterno();
                        }
                        alturaMinima = (alturaMinima != null && alturaMinima == 0) ? null : alturaMinima;
                        String estado = item.getIdNeumatico().getIdEstadoMedicion().getNombre();
                        tablaInf.addCell(ReportUtil.getCelda(posicion, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                        tablaInf.addCell(ReportUtil.getCelda(codigo, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                        tablaInf.addCell(ReportUtil.getCelda(marca, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                        tablaInf.addCell(ReportUtil.getCelda(medida, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                        tablaInf.addCell(ReportUtil.getCelda(reenc, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                        tablaInf.addCell(ReportUtil.getCelda(((alturaMinima == null) ? "" : alturaMinima + ""), 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                        tablaInf.addCell(ReportUtil.getCelda(estado, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                        tablaInf.addCell(ReportUtil.getCelda(item.getIdNeumatico().getKmTotal() + "", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                    }
                }
                tablaInf.addCell(ReportUtil.getCeldaBorde("--------------", 8, 1, BaseColor.WHITE, 0, 0, 9, 1));
            }
            document.add(tablaInf);
            document.close();
            File pdfFile = new File(nombrePdf);
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(pdfFile);
            } else {
                JOptionPane.showMessageDialog(null, "No se puede abrir el reporte.", "Error al abrir el archivo", JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(Principal.getInstance(), ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            ex.printStackTrace();
        }
    }
    
    private List<ControlCambioNeumatico> getListaNeumaticos(Flotillas flotilla, TiposVehiculo tipoVehiculo, MarcasVehiculo marcaVehiculo, Date fechaDesde, Date fechaHasta){
        List<ControlCambioNeumatico> lista = new ArrayList<ControlCambioNeumatico>();
        List<Integer> idsUnidades;
        java.sql.Date sqlFechaIni, sqlFechaFin;
        String sql = "SELECT V.id FROM Vehiculos V WHERE";
        if(flotilla != null){
            sql += " V.idFlotilla.id = :idFlotilla AND";
        }
        if(tipoVehiculo != null){
            sql += " V.idTipo.id = :idTipo AND";
        }
        if(marcaVehiculo != null){
            sql += " V.idMarca.id = :idMarca AND";
        }
        if(fechaDesde != null){
            sql += " V.fechaCompra >= :fechaIni AND V.fechaCompra <= :fechaFin AND";
        }
        sql += " V.estado = 1 ORDER BY V.placa";
        Query q = em.createQuery(sql);
        if(flotilla != null){
            q.setParameter("idFlotilla", flotilla.getId());
        }
        if(tipoVehiculo != null){
            q.setParameter("idTipo", tipoVehiculo.getId());
        }
        if(marcaVehiculo != null){
            q.setParameter("idMarca", marcaVehiculo.getId());
        }
        if(fechaDesde != null){
            sqlFechaIni = new java.sql.Date(fechaDesde.getTime());
            sqlFechaFin = new java.sql.Date(fechaHasta.getTime());
            q.setParameter("fechaIni", sqlFechaIni);
            q.setParameter("fechaFin", sqlFechaFin);
        }
        idsUnidades = q.getResultList();
        for(Integer id : idsUnidades){
            Query q1 = em.createQuery("SELECT C FROM ControlCambioNeumatico C "
                    + "WHERE C.idVehiculo.id = :id ORDER BY C.id DESC");
            q1.setParameter("id", id);
            q1.setMaxResults(1);
            List lst = q1.getResultList();
            if(!lst.isEmpty()){
                ControlCambioNeumatico control = (ControlCambioNeumatico)lst.get(0);
                lista.add(control);
            }
        }
        return lista;
    }
}
